let arr1: number[] = [1, 2, 3, 4, 5]
let arr2: Array<number> = [1, 2, 3, 4, 5]
let arr3: (number | string)[] = [1, 2, 3, 'a', 'b']
let tuple:[string, number, string, number] = ['1', 2, '3', 4]
console.log(tuple[3]);
// 维护一组常量的时候 可以采用枚举
const enum STATUS { // 常量枚举 不会额外编译成对象，所以更节约
  'OK' = 'ok',
  'NO_OK' = 100,
  'NOT_FOUND'
}

// 类型可以进行反举（值是数字的时候 可以反过来枚举）
const r = STATUS['OK']
console.log(r)

const u: undefined = undefined
const n: null = null
// 如果禁用非严格null检测，null和undefined 可以赋予任何类型（null, undefined任何类型的子类型）

// void 类型代表的是空类型   undefined  void  这个void一般只表示函数的返回值

function a():void {
  return undefined
}

function whileTrue(): never {
  while(true) {} // 函数无法达到执行完毕的状态
}

function throwError(): never {
  throw Error() // 出错函数无法执行完毕
}

// 如果if/else 条件都走完了，没有遗漏的 后面的类型就是 never（完整性保护）
// 111 [1,1,1]
// '111' ['1', '1', '1']
// true ['t', 'r', 'u', 'e']
function validateCheck(v: never) {}
function toArray(val:number | string | boolean) {
  if (typeof val === 'number') {
    return val.toString().split('').map(Number)
  }
  if (typeof val === 'string') {
    return val.split('')
  }
  if (typeof val === 'boolean') {
    return val.toString().split('')
  }
  // never类型 只能被never类型来赋予值
  // const n:never = val
  validateCheck(val) // 代码的完整性保护
}
toArray('abc')

// any 任何类型 能不写any 就不要用any，any会导致类型丧失检测 anyScript(如果我们的项目是采用ts编写的，一般情况下any的出现场景不多) 放弃检测，出错就怨自己，没有ts的加持

let a1:any = 1
a1 = '1'
let a2 = function() {}

// object 引用类型
function create(val: object) { // {} object Object的区别

}

create({})
create(function() {})
create([])

const symbol: symbol = Symbol()
const bigint = BigInt(Number.MAX_SAFE_INTEGER)

// symbol bigInt

// string number boolean 数组 元组 枚举 null undefined void never any object symbol bigInt

export {} // 这是一个独立的模块，不会影响其他人